package com.ruoyi.factory.dataCopy.service.impl;

import com.ruoyi.factory.dataCopy.service.IMySqlDataCopyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class MySqlDataCopyServiceImpl implements IMySqlDataCopyService {
    protected final Logger logger = LoggerFactory.getLogger(MySqlDataCopyServiceImpl.class);

    public void exeute (){
        String mysqlUser = "root";
        String mysqlPassword = "root";
        String dbname = "数据库名字";
        String backupDir = "备份文件存储地址";

        int exprireDays = 15;

        String backupTime = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());
        String backupFileName = dbname + "-" + backupTime + ".sql";

        String[] command = new String[]{"mysqldump","-u"+mysqlUser,"-B",dbname};
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.environment().put("MYSQL_PWD",mysqlPassword);

        File backupFile = new File(backupDir, backupFileName);
        processBuilder.redirectOutput(backupFile);

        try {
            Process pocess = processBuilder.start();
            int exitStatus = pocess.waitFor();
            if(exitStatus == 0){
                //备份成功,可以继续实现删除过期备份的逻辑
                logger.info("数据库备份成功");
                cleanupOldBackups(backupDir, exprireDays);
            }else{
                //备份失败,可以记录日志或者进行其他处理
                logger.error("数据库备份失败:"+exitStatus);
                //输出错误信息
                BufferedReader errorReader = new BufferedReader(new InputStreamReader(pocess.getErrorStream()));
                String line;
                while((line = errorReader.readLine()) != null){
                    logger.error(line);
                }
            }
        } catch (IOException  | InterruptedException e) {
            e.printStackTrace();
            logger.error("备份数据库出现异常"+e.getMessage());
        }


    }

    private void cleanupOldBackups (String backupDir, int expirDays){
        File dir = new File(backupDir);
        File[] files = dir.listFiles();

        if(files != null){
            for (File file : files) {
                long diffInMillies = System.currentTimeMillis()- file.lastModified();
                long diffInDays = TimeUnit.DAYS.convert(diffInMillies,TimeUnit.MILLISECONDS);
                if(diffInDays>expirDays){
                    if(file.delete()){
                        logger.info("已删除就备份文件: "+ file.getName());
                    }else{
                        logger.info("未能删除旧备份文件: "+file.getName());
                    }
                }
                //优点: 1、实体卡易丢失和盗取 杜绝假卡消费 2、验证码校验可防止持卡者授权外消费 3、短信通知，让客户对账单一目了然 4、交易记录清晰，有据可查 5、统计功能可查看经营数据和分析 完全免费使用
                //会开发一个移动端管理平台 终身免费赠 送2年产品维护(产品升级)免费时间为2年((最近两年不低于100元充值)2年3个月零18天定时任务报错 不让添加新用户和导出数据 1个月之后不让消费) 每年600
                //启动脚本 自己启动 点击启动
                //收费:  云产品 pc+移动端+客户端 1000 基础版 用户在1000及以下 每次可以扩展500个 1个1元 数据保留5年
            }
        }
    }
}
